package com.itheima.web;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.common.MessageConstant;
import com.itheima.common.utils.POIUtils;
import com.itheima.pojo.OrderSetting;
import com.itheima.pojo.Result;
import com.itheima.service.OrderSettingService;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @version V1.0
 * @author: yongjichu
 * @date: 2020/1/15 18:52
 * @description:
 */
@RestController
@RequestMapping("/ordersetting")
public class OrderSettingController {
    @Reference(cluster = "failfast")
    private OrderSettingService orderSettingService;

    @RequestMapping("/setNumberByDate")
    public Result setNumberByDate(@RequestBody OrderSetting orderSetting) {
        try {
            orderSettingService.setNumberByDate(orderSetting);
            return Result.success(true, MessageConstant.ORDERSETTING_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error(false, MessageConstant.ORDERSETTING_FAIL);
        }
    }

    /**
     * 批量上传文件
     *
     * @return
     */
    @RequestMapping("/upload")
    public Result upload(MultipartFile excelFile) {
        try {
            //使用工具类获取里面的数据
            //数据类型是list集合里面嵌套着string的数组，通过工具类的代码可以知道，string数组里存放的就是每一行的数据
            List<String[]> listExcel = POIUtils.readExcel(excelFile);
            //将 List<String[]>这种数据类型转为List<ordeersetting>类型，为了在service层直接调用之前写过的方法
            List<OrderSetting> listOrderSetting = new ArrayList<>();
            if (CollectionUtil.isNotEmpty(listExcel)) {
                for (String[] row : listExcel) {
                    //row存放的就是每一行的数据，使用string数组封装起来的
                    //0索引位置存放的就是日期数据
                    if (row.length != 2) {
                        continue;
                    }
                    String dateStr = row[0];
                    //1索引位置就是存放的预约人数的位置
                    String numberStr = row[1];
                    if (StringUtils.isEmpty(dateStr) || StringUtils.isEmpty(numberStr)) {
                        continue;
                    }
                    //将这两个数据存到ordersetting对象中，首先创建一个ordersetting对象，然后再把这两个数据转换成为对象中的数据类型
                    OrderSetting orderSetting = new OrderSetting(DateUtil.parse(dateStr, "yyyy/MM/dd"), Integer.valueOf(numberStr));
                    listOrderSetting.add(orderSetting);
                }

            }
            //这里方法传递的值就是listOrderSetting
            orderSettingService.batchSave(listOrderSetting);
            return Result.success(true, MessageConstant.IMPORT_ORDERSETTING_SUCCESS);
        } catch (IOException e) {
            e.printStackTrace();
            return Result.error(false, MessageConstant.IMPORT_ORDERSETTING_FAIL);
        }

    }

    /**
     * 根据前端传进来的数据（即年份和月份）获取对应的这个月的设置的每天的预约人数和以预约人数
     * 后台使用map接收
     *
     * @return
     */
    @RequestMapping("/getOrderSettingByMonth")
    public Result getOrderSettingByMonth(@RequestBody Map map) {
        //获取map里面的数据,得到的字符串就是这种形式（2020-01）
        String date = (String) map.get("month");
/*
        返回的数据类型一定要是这种形式：  {"date":22,"month":0,"number":300,"reservations":300,},
        但是有没有这样的实体对象封装，所以我们使用list里面嵌套map集合的形式
*/
        try {
            List<Map> mapList=orderSettingService.getOrderSettingByMonth(date);
            return Result.success(true,MessageConstant.GET_ORDERSETTING_SUCCESS,mapList);
        } catch (Exception e){
            e.printStackTrace();
            return Result.error(false,MessageConstant.GET_ORDERSETTING_FAIL);
        }
    }
}
